﻿//========================================
// All rights reserved (C) 2017-2100
// CLR 版本：	4.0.30319.42000
// 命名空间:	SFJDService.SocketHandle
// 文 件 名：	PH05SeRequestReply
// 作    者：	WooG
// 联系方式：	wooglle@163.com
// 创建时间：	2017/9/27 14:46:31
//========================================
using Common;
using Network.UpdateData;
using System;
using System.Linq;
using System.Net.Sockets;
using System.Text;

namespace SFJDService.SocketHandle
{
    /// <summary>
    /// <para>TCP, code: 1303</para>
    /// 发送端收到接收端开始接收指定guid文件任务的指令，在接收端的接收列表里删除指定任务，然后开始用1304指令发送文件列表
    /// </summary>
    class PH05SeRequestReply : PacketHandle
    {
        public PH05SeRequestReply(Socket socket, Packet packet) : base(socket, packet)
        {
        }

        protected override void Handle()
        {
            //
            //采用UTF-8进行编码时，因为不定长，需要在接收端合并字节码，或者对发送端字节码进行合理分割
            //
            Guid transGuid = new Guid(Message);

            //在列表里加入任务guid，以停止1301的持续发送请求
            Runtime.transportSend.Add(transGuid);
            //开始读取本地传送列表
            //ClassTransportInfo transInfo = new XmlTransport(TransportType.Upload, Runtime.pathTemp).GetTransInfo(transGuid);
            ClassTransportInfo transInfo = Runtime.xmlUpload.GetTransInfo(transGuid);

            int reGotCode = typeof(PH05ReGotTransInfo).GetDictianaryKey();
            if (transInfo.RootPath != null)
            {
                string paths = transInfo.Coding2String();

                //int guidLength = 36;//获取任务GUID的长度
                int reader = 0;//初始化读取指针
                byte[] pats = Encoding.BigEndianUnicode.GetBytes(paths);//获取字节码
                //1024 - 40 - (36 + 1) * 2 = 910
                int readLength = pats.Length > 910 ? 910 : pats.Length;//设置最大发送长度
                while (reader < pats.Length)//如果读取指针未到达末尾，则进行循环
                {
                    byte[] buf = pats.Skip(reader).Take(readLength).ToArray();//以指针为起点，读取指定长度
                    string st = Encoding.BigEndianUnicode.GetString(buf);//将字节码转为string，以便建包
                    string s = Message + '♠' + st;//在读取的字符串头部加上GuidTransport
                    Launcher.SendMsg2One(reGotCode, guidSend, s);
                    //Launcher.SendTcp(reGotCode, GetIpSend(), s);//发送包
                    reader += readLength;//指针偏移
                    if (reader + readLength > pats.Length)//如果超出末尾，则设置读取长度为剩余的长度
                    {
                        readLength = pats.Length - reader;
                    }
                }
                Delay(50);
                Launcher.SendMsg2One(reGotCode, guidSend, Message + '♠');
                //Launcher.SendTcp(reGotCode, GetIpSend(), Message + '♠');
                /////////////////////////////////
                ////////////////////////////////
                ///////////////////////////////
            }
            else
            {
                throw new Exception();
            }
        }
    }
}
